#define HASH_TABLE_SIZE 1111
-//#define SHOW_PATH
-
/* A default palette, containing standard ANSI / EGA colors
*
*/
-static unsigned char defpal_data[4*16] =
-{
+static unsigned char defpal_data[4*16] =
+{
0 ,0 ,0 ,255,
127,0 ,0 ,255,
0 ,127,0 ,255,
}
}
+#define BABL_IDX_FACTOR 255.5
+
static int
babl_palette_lookup (BablPalette *pal, int r, int g, int b, int a)
{
static void
rgba_to_pal (Babl *conversion,
- char *src,
+ char *src_b,
char *dst,
long n,
void *dst_model_data)
{
+ const Babl *space = babl_conversion_get_source_space (conversion);
BablPalette **palptr = dst_model_data;
- BablPalette *pal = *palptr;
-#ifdef SHOW_PATH
- fprintf (stderr, "d");
-#endif
+ BablPalette *pal;
+ assert (palptr);
+ pal = *palptr;
+ assert(pal);
+
while (n--)
{
- int idx;
-
- int best_idx = 0;
- double best_diff = 100000;
- double srcf[4];
+ double *src_d = (void*) src_b;
+ unsigned char src[4];
int c;
- for (c = 0; c < 4; c++)
+ for (c = 0; c < 3; c++)
{
- srcf[c] = ((double *) src)[c];
- if (srcf[c] < 0.0)
- srcf[c] = 0.0;
- if (srcf[c] > 1.0)
- srcf[c] = 1.0;
+ if (src_d[c] >= 1.0f)
+ src[c] = 255;
+ else if (src_d[c] <= 0.0f)
+ src[c] = 0;
+ else
+ src[c] = babl_trc_from_linear (space->space.trc[0],
+ src_d[c]) * 255 + 0.5f;
}
+ if (src_d[3] >= 1.0f)
+ src[3] = 255;
+ else if (src_d[3] <= 0.0f)
+ src[3] = 0;
+ else
+ src[3] = src_d[3] * 255 + 0.5f;
- for (idx = 0; idx<pal->count; idx++)
- {
- double diff;
- double *palpx = ((double *)pal->data_double) + idx * 4;
-
- diff = (palpx[0] - srcf[0]) * (palpx[0] - srcf[0]) +
- (palpx[1] - srcf[1]) * (palpx[1] - srcf[1]) +
- (palpx[2] - srcf[2]) * (palpx[2] - srcf[2]);
- if (diff <= best_diff)
- {
- best_diff = diff;
- best_idx = idx;
- }
- }
-
- ((double *) dst)[0] = best_idx / 255.5;
+ ((double *) dst)[0] =
+ babl_palette_lookup (pal, src[0], src[1], src[2], src[3]) /
+ BABL_IDX_FACTOR;
- src += sizeof (double) * 4;
+ src_b += sizeof (double) * 4;
dst += sizeof (double) * 1;
}
+
}
static void
rgba_to_pala (Babl *conversion,
- char *src,
+ char *src_i,
char *dst,
long n,
void *dst_model_data)
{
+ const Babl *space = babl_conversion_get_destination_space (conversion);
BablPalette **palptr = dst_model_data;
- BablPalette *pal = *palptr;
-
-#ifdef SHOW_PATH
- fprintf (stderr, "D");
-#endif
+ BablPalette *pal;
+ assert (palptr);
+ pal = *palptr;
assert(pal);
+
while (n--)
{
- int idx;
-
- int best_idx = 0;
- double best_diff = 100000;
- double srcf[4];
- double alpha;
+ double *src_d = (void*) src_i;
+ unsigned char src[4];
int c;
- for (c = 0; c < 4; c++)
+ for (c = 0; c < 3; c++)
{
- srcf[c] = ((double *) src)[c];
- if (srcf[c] < 0.0)
- srcf[c] = 0.0;
- if (srcf[c] > 1.0)
- srcf[c] = 1.0;
+ if (src_d[c] >= 1.0f)
+ src[c] = 255;
+ else if (src_d[c] <= 0.0f)
+ src[c] = 0;
+ else
+ src[c] = babl_trc_from_linear (space->space.trc[0],
+ src_d[c]) * 255 + 0.5f;
}
+ if (src_d[3] >= 1.0f)
+ src[3] = 255;
+ else if (src_d[3] <= 0.0f)
+ src[3] = 0;
+ else
+ src[3] = src_d[3] * 255 + 0.5f;
- alpha = srcf[3];
-
- for (idx = 0; idx<pal->count; idx++)
- {
- double diff;
- double *palpx = ((double *)pal->data_double) + idx * 4;
-
- diff = (palpx[0] - srcf[0]) * (palpx[0] - srcf[0]) +
- (palpx[1] - srcf[1]) * (palpx[1] - srcf[1]) +
- (palpx[2] - srcf[2]) * (palpx[2] - srcf[2]);
- if (diff <= best_diff)
- {
- best_diff = diff;
- best_idx = idx;
- }
- }
- ((double *) dst)[0] = best_idx / 255.5;
- ((double *) dst)[1] = alpha;
+ ((double *) dst)[0] = babl_palette_lookup (pal, src[0], src[1], src[2],
+ src[3]) / BABL_IDX_FACTOR;
+ ((double *) dst)[1] = src_d[3];
- src += sizeof (double) * 4;
+ src_i += sizeof (double) * 4;
dst += sizeof (double) * 2;
}
}
assert(pal);
while (n--)
{
- int idx = (((double *) src)[0]) * 255.5;
+ int idx = (((double *) src)[0]) * BABL_IDX_FACTOR;
double *palpx;
if (idx < 0) idx = 0;
assert(pal);
while (n--)
{
- int idx = (((double *) src)[0]) * 255.5;
+ int idx = (((double *) src)[0]) * BABL_IDX_FACTOR;
double alpha = (((double *) src)[1]);
double *palpx;
assert (palptr);
pal = *palptr;
assert(pal);
-#ifdef SHOW_PATH
- fprintf (stderr, "8");
-#endif
+
while (n--)
{
dst[0] = babl_palette_lookup (pal, src[0], src[1], src[2], src[3]);
pal = *palptr;
assert(pal);
-#ifdef SHOW_PATH
- fprintf (stderr, "f");
-#endif
while (n--)
{
float *src_f = (void*) src_b;
assert (palptr);
pal = *palptr;
assert(pal);
-#ifdef SHOW_PATH
- fprintf (stderr, "F");
-#endif
+
while (n--)
{
float *src_f = (void*) src_b;
"chroma",
NULL);
alpha = babl_component ("A");
-
model = babl_model_new ("name", name, component, alpha, NULL);
palptr = malloc (sizeof (void*));
*palptr = default_palette ();;
"data", palptr,
NULL
);
-
babl_conversion_new (
f_pal_u8,
f_pal_a_u8,
"linear", conv_pal8_pala8,
NULL
);
-
babl_conversion_new (
f_pal_a_u8,
f_pal_u8,
"linear", conv_pala8_pal8,
NULL
);
-
-
babl_conversion_new (
f_pal_u8,
babl_format ("R'G'B'A u8"),
"linear", pal_u8_to_rgba_u8,
"data", palptr,
NULL);
-
-
babl_conversion_new (
f_pal_a_u8,
babl_format ("R'G'B'A u8"),